package com.chengz.main;


import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;

public class TestConstructors {

/*
 * 通过Class对象可以获取某个类中的：构造方法、成员变量、成员方法；并访问成员；
 *
 * 1.获取构造方法：
 *      1).批量的方法：
 *          public Constructor[] getConstructors()：所有”公有的”构造方法
            public Constructor[] getDeclaredConstructors()：获取所有的构造方法(包括私有、受保护、默认、公有)

 *      2).获取单个的方法，并调用：
 *          public Constructor getConstructor(Class… parameterTypes):获取单个的”公有的”构造方法：
 *          public Constructor getDeclaredConstructor(Class… parameterTypes):获取”某个构造方法”可以是私有的，或受保护、默认、公有；
 *
 *          调用构造方法：
 *          Constructor–>newInstance(Object… initargs)
 */

    public static void main(String[] args) {

        try {
            Class c=Class.forName("com.chengz.bo.Student");

            Constructor[] constructors=c.getConstructors();

            for(Constructor cons : constructors){

                System.out.println(cons);
            }


            System.out.println("我是分割线- - - - - - - - - - - - - - - - --  -- -");

            Constructor []  allconstructors=c.getDeclaredConstructors();

            for(Constructor constructor: allconstructors ){

                System.out.println(constructor);
            }

            System.out.println(allconstructors);

            System.out.println("获取单个方法- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ");

            Constructor constructor1= c.getConstructor(null);

            System.out.println(constructor1);

            Constructor constructor2= c.getDeclaredConstructor(char.class);

            System.out.println(constructor2);

            Constructor constructor3=c.getDeclaredConstructor(boolean.class);

            System.out.println(constructor3);

            System.out.println("测试调用方法：- - - - - - - - - - - - - - - - -");

            Object obj=constructor1.newInstance();

            constructor2.setAccessible(true);
            constructor2.newInstance('s');


            constructor3.setAccessible(true);
            constructor3.newInstance(false);

        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (NoSuchMethodException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (InstantiationException e) {
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            e.printStackTrace();
        }

    }





}
